#include "mouvement.h"

Mouvement::Mouvement( Vectorf * aSommetDepart, Vectorf * aSommetArrive, float aTime, float aInterval, Vectorf * aPosition)
{
        position=aPosition;
        nbIteration=0;
        distanceParcourue=0;
        vitesse=0;
        end=0;

        sommetDepart=new Vectorf(*aSommetDepart);
        sommetArrive=aSommetArrive;

         sommetDepart->Print();

        vecteurDirecteur= new Vectorf(0.0,0.0,0.0);
        *vecteurDirecteur= *sommetArrive-*sommetDepart;

        time=aTime;
        interval=aInterval;

        printf("intervalol : %f \n",interval);


        //	La formule de base étant :

        //	distance= distanceInitiale + vitesse*deltaT + (acceleration*deltaT²)/2

        /*
         * 	Détermine la distance à parcourir
         */

        printf("vecteur directeur %f %f %f \n", vecteurDirecteur->x(), vecteurDirecteur->y(), vecteurDirecteur->z());

        distance=vecteurDirecteur->Norme();

        printf("distance : %f \n",distance);

        /*
         * 	On recherche la valeur de l'accélération pour que à temps/2, le sprite ait parcoururu la moitié du chemin
         */

        acceleration=(
                                        (distance/2.0)
                                        /
                                        (pow(((double)time/2.0),2))*2.0);


        vitesseMax=acceleration*time/2.0;


}

void Mouvement::Do()
{
    if(end==0)
    {
        nbIteration++;

        //	distance= distanceInitiale + vitesse*deltaT + (acceleration*deltaT²)/2

        if(distanceParcourue>distance/2.0 && acceleration>0.0)
        {
                acceleration= -acceleration;
        }

        printf("nIteration : %i \n", nbIteration);
        printf("Acceleration : %f \n", acceleration);
        printf("Interval : %f \n",interval);
        printf("distance : %f \n",distance);

        distanceParcourue=distanceParcourue+vitesse*interval+((acceleration*pow(interval,2))/2);

        printf("Distance parcourue : %f \n", distanceParcourue);

        printf("Vitesse : %f \n", vitesse);

        vitesse+=acceleration*interval;

        printf("Vitesse : %f \n", vitesse);



        if(distanceParcourue>distance)
        {
            end=1;
        }
        else
        {

        Vectorf temp=*vecteurDirecteur;
        temp=temp*((distanceParcourue)/(distance));
        (*sommetDepart*temp).Print();
        *position=*sommetDepart+temp;

        sommetDepart->Print();
        printf(" %f %f %f \n \n", temp.x(), temp.y(), temp.z());

    }
}
}

MoveConstant::MoveConstant(Vectorf *aSommetDepart, Vectorf *aSommetArrive, float aInterval, float aVitesse, Vectorf *aPosition, Vectorf * aCamera)
{
    vitesse=aVitesse;

    sommetDepart=new Vectorf(*aSommetDepart);
    camera=aCamera;

    sommetArrive=aSommetArrive;
    interval=aInterval;
    end=0;
    position=aPosition;
    elapsedTime=0;

    vecteurDirecteur= new Vectorf(0.0,0.0,0.0);
    *vecteurDirecteur= *sommetArrive-*sommetDepart;
     printf("loliloltest \n");
    nbIteration=0;

}

void MoveConstant::Do()
{
    Vectorf temp=*vecteurDirecteur;
    temp=temp*((nbIteration)/(vitesse));
    elapsedTime+=interval;

    printf("vilol %f \n",vitesse*elapsedTime);
    printf("vecnorme %f \n",vecteurDirecteur->Norme());

    if(vitesse*elapsedTime>vecteurDirecteur->Norme())
    {
        end=1;
        *position=*sommetArrive;
        *camera=*sommetArrive;
    }
    else
    {
        printf("vite: %f",vitesse*elapsedTime);
        *position=*sommetDepart+((vecteurDirecteur->Normalize())*(vitesse*elapsedTime));
        *camera=*sommetDepart+((vecteurDirecteur->Normalize())*(vitesse*elapsedTime));
    }

    nbIteration++;
}
